/**
 * Notes: 表白墙业务逻辑 (新版API)
 * Ver : WeCollege Server API 1.0.0
 * Date: 2025-01-27
 * Description: 使用新的API服务重构表白墙业务逻辑
 */

const { PostService, CommonService } = require('../../../helper/api_services.js');
const helper = require('../../../helper/helper.js');
const validate = require('../../../helper/validate.js');

class BoardBiz {
  
  // 表白墙分类ID (对应后端的typeId)
  static BOARD_TYPE_ID = 'board';
  
  /**
   * 初始化表单数据
   * @param {string} id - 编辑时的ID
   * @returns {object} 表单初始数据
   */
  static initFormData(id = '') {
    return {
      id,
      formTitle: '',
      formContent: '',
      formTypeId: BoardBiz.BOARD_TYPE_ID,
      formPic1: '',
      formPic2: '',
      formPic3: '',
      formForms: [], // 自定义表单字段
      
      // 表白墙特有字段
      formTo: '',     // 表白对象
      formFrom: '',   // 表白者
      formDesc: '',   // 表白描述
    };
  }

  /**
   * 获取表白墙分类列表
   * @returns {Array} 分类列表
   */
  static getCateList() {
    return [
      { label: '表白', type: 'love', value: 'love' },
      { label: '告白', type: 'confession', value: 'confession' },
      { label: '感谢', type: 'thanks', value: 'thanks' },
      { label: '道歉', type: 'apology', value: 'apology' },
      { label: '其他', type: 'other', value: 'other' }
    ];
  }

  /**
   * 根据分类ID获取分类名称
   * @param {string} cateId - 分类ID
   * @returns {string} 分类名称
   */
  static getCateName(cateId) {
    const cateList = BoardBiz.getCateList();
    const cate = cateList.find(item => item.value === cateId);
    return cate ? cate.label : '其他';
  }

  /**
   * 发布表白墙
   * @param {object} data - 表白数据
   * @returns {Promise} 发布结果
   */
  static async insert(data) {
    // 构建帖子数据
    const postData = {
      title: data.formTitle || `${data.formFrom} 对 ${data.formTo}`,
      content: data.formContent || data.formDesc,
      typeId: BoardBiz.BOARD_TYPE_ID,
      pic1: data.formPic1 || '',
      pic2: data.formPic2 || '',
      pic3: data.formPic3 || ''
    };

    // 调用帖子发布API
    const result = await PostService.insert(postData);
    
    // 返回兼容格式
    return {
      data: {
        id: result.data?.postId || result.data?.id
      }
    };
  }

  /**
   * 更新表白墙
   * @param {object} data - 表白数据
   * @returns {Promise} 更新结果
   */
  static async edit(data) {
    // 构建帖子数据
    const postData = {
      postId: data.id,
      title: data.formTitle || `${data.formFrom} 对 ${data.formTo}`,
      content: data.formContent || data.formDesc,
      typeId: BoardBiz.BOARD_TYPE_ID,
      pic1: data.formPic1 || '',
      pic2: data.formPic2 || '',
      pic3: data.formPic3 || ''
    };

    // 调用帖子更新API
    return await PostService.update(postData);
  }

  /**
   * 获取表白墙详情
   * @param {string} id - 表白墙ID
   * @returns {Promise} 表白墙详情
   */
  static async detail(id) {
    const post = await PostService.getSingle(id);
    
    // 转换为表白墙格式
    return BoardBiz.convertPostToBoard(post);
  }

  /**
   * 查看表白墙 (增加访问量)
   * @param {string} id - 表白墙ID
   * @returns {Promise} 表白墙详情
   */
  static async view(id) {
    // 增加访问量
    await PostService.visit(id);
    
    // 获取详情
    return await BoardBiz.detail(id);
  }

  /**
   * 获取表白墙列表
   * @param {object} params - 查询参数
   * @returns {Promise} 表白墙列表
   */
  static async getList(params = {}) {
    // 构建查询条件
    const query = {
      pageNo: params.page || 1,
      pageSize: params.size || 20,
      typeId: BoardBiz.BOARD_TYPE_ID,
      sortBy: params.sortBy || 'createTimestamp',
      isAsc: params.isAsc || false,
      str: params.search || '',
      ...params
    };

    const result = await PostService.query(query);
    
    // 转换数据格式
    const list = result.map(post => BoardBiz.convertPostToBoard(post));
    
    return {
      page: query.pageNo,
      size: query.pageSize,
      list: list,
      count: Math.ceil(list.length / query.pageSize),
      total: list.length,
      oldTotal: params.oldTotal || 0
    };
  }

  /**
   * 获取我的表白墙列表
   * @param {object} params - 查询参数
   * @returns {Promise} 我的表白墙列表
   */
  static async getMyList(params = {}) {
    const query = {
      pageNo: params.page || 1,
      pageSize: params.size || 20,
      sortBy: params.sortBy || 'createTimestamp',
      isAsc: params.isAsc || false,
      ...params
    };

    const result = await PostService.queryMyPost(query);
    
    // 过滤表白墙类型的帖子
    const boardList = result.list
      .filter(post => post.typeId === BoardBiz.BOARD_TYPE_ID)
      .map(post => BoardBiz.convertPostToBoard(post));
    
    return {
      page: result.pageNo || query.pageNo,
      size: result.pageSize || query.pageSize,
      list: boardList,
      count: result.pages || Math.ceil(boardList.length / query.pageSize),
      total: result.total || boardList.length,
      oldTotal: params.oldTotal || 0
    };
  }

  /**
   * 删除表白墙
   * @param {string} id - 表白墙ID
   * @returns {Promise} 删除结果
   */
  static async delete(id) {
    return await PostService.delete(id);
  }

  /**
   * 点赞表白墙
   * @param {string} id - 表白墙ID
   * @returns {Promise} 点赞结果
   */
  static async like(id) {
    return await PostService.like(id);
  }

  /**
   * 取消点赞表白墙
   * @param {string} id - 表白墙ID
   * @returns {Promise} 取消点赞结果
   */
  static async dislike(id) {
    return await PostService.dislike(id);
  }

  /**
   * 设置表白墙状态
   * @param {string} id - 表白墙ID
   * @param {number} status - 状态 (1=正常, 0=隐藏)
   * @returns {Promise} 设置结果
   */
  static async setStatus(id, status) {
    // 这个功能需要后端支持，暂时返回成功
    console.log(`设置表白墙 ${id} 状态为 ${status}`);
    return { code: 200, msg: '设置成功' };
  }

  /**
   * 将帖子数据转换为表白墙格式
   * @param {object} post - 帖子数据
   * @returns {object} 表白墙数据
   */
  static convertPostToBoard(post) {
    if (!post) return null;

    // 尝试从标题中解析表白信息
    const titleMatch = post.title?.match(/(.+?)\s*对\s*(.+?)$/) || [];
    const from = titleMatch[1] || '';
    const to = titleMatch[2] || '';

    return {
      // 兼容原有字段名
      BOARD_ID: post.postId,
      BOARD_TITLE: post.title,
      BOARD_CONTENT: post.content,
      BOARD_ADD_TIME: post.createTimestamp,
      BOARD_EDIT_TIME: post.updateTimestamp,
      BOARD_USER_ID: post.userId,
      BOARD_TYPE_ID: post.typeId,
      BOARD_STATUS: 1, // 默认正常状态
      BOARD_VOUCH: 0,  // 默认未推荐
      BOARD_ORDER: 9999, // 默认排序
      BOARD_VIEW_COUNT: post.visitNum || 0,
      BOARD_COMMENT_COUNT: post.commentNum || 0,
      BOARD_LIKE_COUNT: post.likeNum || 0,
      BOARD_PIC: [post.pic1, post.pic2, post.pic3].filter(pic => pic),
      
      // 表白墙特有字段
      BOARD_OBJ: {
        from: from,
        to: to,
        desc: post.content,
        pic: [post.pic1, post.pic2, post.pic3].filter(pic => pic)
      },
      
      // 新增字段
      BOARD_CATE_ID: 'love', // 默认分类
      BOARD_FORMS: [], // 自定义表单
      
      // 用户信息 (如果有)
      USER_NAME: post.nickName || '',
      USER_PIC: post.image || '',
      
      // 点赞状态
      IS_LIKE: post.like === 1,
    };
  }

  /**
   * 表单验证规则
   */
  static get CHECK_FORM() {
    return {
      formTitle: 'formTitle|must|string|min:1|max:100|name=标题',
      formContent: 'formContent|must|string|min:1|max:1000|name=内容',
      formTo: 'formTo|must|string|min:1|max:50|name=表白对象',
      formFrom: 'formFrom|must|string|min:1|max:50|name=表白者',
    };
  }
}

module.exports = BoardBiz;